﻿#include<iostream>
#include<windows.h> //windows API
#include<mmsystem.h> // 多媒体文件
#pragma comment(lib,"winmm.lib")
/*
链接库文件：这行代码告诉编译器/链接器，在生成可执行文件时需要链接名为  winmm.lib  的静态库文件。
 winmm.lib  的作用：这是 Windows 多媒体编程接口（Windows Multimedia API）的导入库，支持音频、视频、游戏控制器等多媒体功能
*/
void playBGM(const char* music, bool repeat = false, int volume = 50) {
	static int i = 0;/*使用i，这样设计支持同时播放
	static 在函数里面的作用
	生命周期：持续整个程序运行期间
	 作用域：仅在函数内部可见
	初始化：只执行一次*/
	char cmd[100];
	sprintf_s(cmd, "open %s alias bgm%d", music, i);
	// 播放音乐  m media    c control     i interface
	mciSendString(cmd, NULL, 0, NULL);// open打开对此路径的歌 alias起别名为bgm
	// NULL, 0, NULL  表示：不接收返回信息、不处理回调、同步执行命令（适用于简单播放场景)
	// 网易云音乐歌下载格式问题播不了
	sprintf_s(cmd, "play bgm%d %s", i, repeat ? "repeat" : "");
	mciSendString(cmd, NULL, 0, NULL); // play 播放bgm
	sprintf_s(cmd, "setaudio bgm%d volume to %d", i, volume);
	mciSendString(cmd, NULL, 0, NULL);//setaudio设置bgm音量到50（音量范围0~1000）
	i++;
}

int main() {
	playBGM("x64/ge.mp3", true, 20);
	playBGM("x64/yin.wav", false, 200);//wav 音效音频后缀
	//音效是不支持重复播放的，使用true调用后没反应，而且音效播放这种方式很慢,因为是专门开了一个线程放的

	//专门播放音效但不能重复， 后面有重复播放方法
	PlaySound("x64/yin.wav", NULL, SND_FILENAME | SND_ASYNC);
	/*	 NULL （第二个参数  hmod ）
当声音来自可执行文件或 DLL 的资源时，此参数为包含资源的模块句柄（ HMODULE ）。
由于此处直接使用文件路径（而非资源），因此设为  NULL 。

 SND_FILENAME | SND_ASYNC （第三个参数  fdwSound ）
控制播放行为的标志组合（通过按位或  |  合并）：
 SND_FILENAME 
表示第一个参数是文件名。若未指定此标志，函数可能尝试将  pszSound  解释为系统事件别名（如  SystemAsterisk ）。
 SND_ASYNC 
异步播放：函数立即返回，声音在后台播放，不阻塞程序执行。若未指定此标志，默认会同步播放（阻塞当前线程直到播放完成）。*/

	while (true) {//重复播放音效
		PlaySound("x64/yin.wav", NULL, SND_FILENAME | SND_ASYNC);
		getchar();//这个不能去，不然不能实现重复播放了，不算全自动重复播放，每次都要输入下

		//playBGM("x64/yin.wav", false, 200);//只写这一个就能全自动重复播放了，但会非常卡，用不了，知道就行，但不用
	}

	getchar();
	return 0;
}